#include<iostream>
using namespace std;
#include<cstdio>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<cassert>
#include<cstring>


//a.匿名管道
//要求实现子进程用来写数据，父进程用来读数据
int main(){ 
    //1:创建父子进程通信要用的管道
    int fds[2];
    int n = pipe(fds);//pipe是一个输出型参数
    assert(n == 0);//创建成功返回0
    (void)n;

    //2:创建子进程继承父进程的文件描述表
    pid_t id =fork();
    if(id == 0){
        //子进程的范围
        //由于子进程是要写数据的，所以要关闭读端
        close(fds[0]);
        //开始写数据:假设写字符串
        int cnt = 0;
        while(true){
            char buffer[1024];
            cnt++;
            const char* arr = "I am writing";
            snprintf(buffer,sizeof buffer,"child -> parent say: %s,my pid:%d,cnt:%d",arr,getpid(),cnt);
            write(fds[1],buffer,strlen(buffer));
            sleep(1);//一秒写入一次
        }
        exit(0);
    }

    //父进程的范围
    close(fds[1]);
    //2:开始读取数据
    while(true){
        char buffer[1024];
        ssize_t s =  read(fds[0],buffer,sizeof(buffer)-1);
        if(s > 0){//s表示read读到的字节数
            buffer[s] = 0;
        }
        cout<<" 读到的数据是:"<<buffer<<endl;
    }



    n = waitpid(id,nullptr,0);
    assert(n==id);




    return 0;
}